package reflect;

import org.omg.CORBA.PUBLIC_MEMBER;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.URISyntaxException;

public class Text4 {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        /*
            扫描当前类所在包中的所有类，并序列化且调用所有无参方法(公开方法)
         */

        File file = new File(Text4.class.getResource(".").toURI());
        File[] files = file.listFiles(e -> e.getName().endsWith(".class"));
        for (File file1 : files) {
            String className = file1.getName().substring(0, file1.getName().indexOf("."));
            Class cls = Class.forName("reflect." + className);
            Object o = cls.newInstance();
            //获取当前类所有方法
            Method[] method = cls.getMethods();
            for (Method method1 : method) {
                int length = method1.getParameterCount();
                System.out.println(length);
                //判断该方法是否为public方法并且是无参方法
                if (
                        method1.getModifiers() == Modifier.PUBLIC
                                && method1.getParameterCount() == 0
                ) {
                    method1.invoke(o);
                    System.out.println("自动调用"+className+"的方法->"+method1.getName()+"()");
                }
            }
        }
        /*
            getParameterCount():获取参数计数,以一个int值表示; 比如public表示0
            getModifiers():[获得修饰符]以整数形式返回此 Method 对象所表示方法的 Java 语言修饰符。
            Modifier 类提供了 static 方法和常量，对类和成员访问修饰符进行解码。
            修饰符集被表示为整数，用不同的位位置 (bit position) 表示不同的修饰符
         */


    }
}
